#include<bits/stdc++.h>
#define endl "\n";
#define ll long long
#define all(rq) rq.begin(),rq.end()

using namespace std;
const int INF=0x3f3f3f3f;

int main(){
	ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
	int n,m;
	cin>>n>>m;
	vector<vector<ll>> s(n+10,vector<ll>(m+10)); //本国自身实力 
	vector<vector<ll>> a(n+10,vector<ll>(m+10)); //先将a数组初始化任意一点到(1,1)点的dist=max(i-1,j-1) 再将该数组进行二维前缀和后此时任意一点(i,j)表示从(1,1)到 (i,j)形成的矩形之和 
	vector<vector<ll>> ans(n+10,vector<ll>(m+10)); //每个国家的答案 
	
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			cin>>s[i][j];
		}
	} 
	
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){ //初始化 a数组为 任意一点到(1,1)点的dist=max(i-1,j-1)
			ll val=i>j?i-1:j-1;
			a[i][j]=val;
		}
	}

	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){ //对a数组进行二维前缀和 此时任意一个元素a[i][j] 可以表示任何一个国家为原点(0,0)到(+-(i-1),+-(j-1))距离之和 
			a[i][j]+=a[i-1][j]+a[i][j-1]-a[i-1][j-1]; //二维前缀和基本公式不多赘述了
		}
	}

	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){ 
			ans[i][j]+=a[i][m-j+1]; //第三象限
			ans[i][j]+=a[n-i+1][m-j+1]; //第四象限
			ans[i][j]+=a[i][j]; //第一象限
			ans[i][j]+=a[n-i+1][j]; //第二象限
			
			ans[i][j]-=a[1][m-j+1]+a[1][j]+a[i][1]+a[n-i+1][1]; //删除四条重合边
			ans[i][j]*=s[i][j];
		}
	}
	
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			if(j!=1){
				cout<<' ';
			}
			cout<<ans[i][j];
		}
		cout<<endl;
	}
    return 0;
}
